import com.ruiyun.jvppeteer.core.Puppeteer;
import com.ruiyun.jvppeteer.core.browser.Browser;
import com.ruiyun.jvppeteer.core.page.Page;
import com.ruiyun.jvppeteer.options.LaunchOptions;
import com.ruiyun.jvppeteer.options.LaunchOptionsBuilder;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;

/**
 * 用于Jmeter本地音视频流压测WebRTC
 * @description:
 * @author
 * @date: 2020/9/4 16:13
 */
public class Test implements JavaSamplerClient {
    Browser browser;

    /**
     * 入参方法，可以设置多个参数，已设置的参数会显示到Jmeter的参数列表中
     * 参数可以在Jmeter上配置修改
     * @return
     */
    @Override
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument("chromePath", "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
        // 本地视频地址
        params.addArgument("fakeVideoPath", "D:\\Test\\temp\\视频地址test.y4m");
        params.addArgument("fakeAudioPath", "D:\\Test\\temp\\视频地址test.wav");
        params.addArgument("isHeadless", "true");
        params.addArgument("isLocalMedia", "true");
        params.addArgument("isDefaultMedia", "false");
        // 会议URL
//        params.addArgument("meetingUrl", "https://test.io");
        params.addArgument("meetingUrl", "http://test:8080/你的流地址");
        return params;
    }

    /**
     * 初始方法，实际运行时每个线程仅执行一次，在测试方法启动前执行
     * @param javaSamplerContext
     */
    @Override
    public void setupTest(JavaSamplerContext javaSamplerContext) {
        String chromePath = javaSamplerContext.getParameter("chromePath");
        String fakeVideoPath = javaSamplerContext.getParameter("fakeVideoPath");
        String fakeAudioPath = javaSamplerContext.getParameter("fakeAudioPath");
        String path = new String(chromePath.getBytes(), StandardCharsets.UTF_8);
        ArrayList<String> argList = new ArrayList<String>();
        argList.add("--no-sandbox");                        // 禁用沙箱
        argList.add("--disable-setuid-sandbox");
        argList.add("--ignore-certificate-errors");         // 忽略所有网站的证书报错
        argList.add("--use-fake-ui-for-media-stream");      // 不弹音视频权限请求对话框
        argList.add("--use-fake-device-for-media-stream");  // 使用chrome默认的虚拟音视频数据
        if (javaSamplerContext.getParameter("isLocalMedia").equals("true")) {
            // 使用本地的音视频
            argList.add("--use-file-for-fake-video-capture=" + fakeVideoPath);
            argList.add("--use-file-for-fake-audio-capture=" + fakeAudioPath);
        }
        boolean isHeadless = javaSamplerContext.getParameter("isHeadless").equals("true");
        // 指定chrome无头启动
        LaunchOptions options = new LaunchOptionsBuilder().withArgs(argList).withHeadless(isHeadless).withExecutablePath(path).build();
        try {
            browser = Puppeteer.launch(options);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 参数方法，该方法用来传入输入的参数，进行操作测试
     * @param javaSamplerContext
     * @return
     */
    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
        try {
            Page page = browser.newPage();
            page.goTo(javaSamplerContext.getParameter("meetingUrl"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 结束方式，实际运行时每个线程仅执行一次，在测试方法结束后执行
     * @param javaSamplerContext
     */
    @Override
    public void teardownTest(JavaSamplerContext javaSamplerContext) {
        browser.close();
    }
}
